#include <iostream>
#include<string>
#include<unistd.h>
#include <pthread.h>
using namespace std;

int ticket=1000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *my_stream(void *args)
{
    string name=static_cast<const char*>(args);
    while(1)
    {
        //usleep(1000);
        // pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond,&mutex);//排队等待,均衡的让每个线程都能被分配到资源
        //1.线程在等待的过程中会释放锁资源(所以其他的线程也会执行pthread_cond_wait进行等待)
        //2.线程被唤醒之后，是在临界区中，所以pthread_cond_wait返回时会重新申请锁(目的是防止共享资源被破坏)（而且申请锁的过程也要竞争）
        // usleep(1000);
        if(ticket>0)
            cout<<"i am a new thread, my name is "<<name<<",get a ticket:"<<ticket--<<endl;
        else 
            break;  
        pthread_mutex_unlock(&mutex);

    }
}
int main()
{
    //设置局部锁并初始化
    // pthread_mutex_t mutex;
    // pthread_mutex_init(&mutex,nullptr);

    pthread_t tid_1, tid_2, tid_3;
    pthread_create(&tid_1, nullptr, my_stream, (void*)"thread_1");
    pthread_create(&tid_2, nullptr, my_stream, (void*)"thread_2");
    pthread_create(&tid_3, nullptr, my_stream, (void*)"thread_3");

    while(ticket>0)
    {
        usleep(1000);
        // pthread_cond_signal(&cond);//唤醒等待队列的头一个线程
        pthread_cond_broadcast(&cond);//同时唤醒所有等待的线程
    }
    
    // pthread_join(tid_1, nullptr);
    // pthread_join(tid_2, nullptr);
    // pthread_join(tid_3, nullptr);


    return 0;
}